/*************************************************************/
/*                                                           */
/*     MC823 - Laboratorio de Teleprocessamento e Redes      */
/*     1 Semestre / 2013                                     */
/*     Projeto 1 - Cliente e Servidor TCP/UDP de uma Livraria*/
/*                                                           */
/*     Alunos: Joao Gabriel M.D.Mendes - RA 102788           */
/*             Lucas Domingues Lima    - RA 103140           */
/*                                                           */
/*************************************************************/

/* Arquivo: /servidor/manipulamsgs.c
   Definicao: interface entre servidor.c e as funcoes
   			  internas de livraria.c. Interpreta as
   			  mensagens e chama as funcoes apropriadas
   			  implementadas em livraria.c, e retorna
   			  as respostas corretas para servidor.c
*/


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "livraria.h"
#include "manipulamsgs.h"

/*************************************************************
		Funcoes Aulixiares (manipulacao de strings) 
**************************************************************/

//retorna substring da string passada, da posicao 'ini' ate 'fim'.
char* retornaSubstring(char* string,int ini,int fim)
{
    int i,j;
    char *temp;

    if(string == NULL || ini < 0 || fim > strlen(string))
        return NULL;

    temp = (char*) malloc(sizeof(char)*(fim-ini+1)+1);

    j=0;
    for(i=ini;i<=fim;i++)
        temp[j++] = string[i];
    temp[j] = '\0';
    return temp;
}

//acrescenta o char '*' ao final da mensagem, para que 
// as funcoes de envio e recebimento de mensagens saibam
// qual e o ultimo pacote de dada mensagem.
char* encapsulaResposta(char *a)
{
	int tamA,i;
	char *temp;

	if(a == NULL)
	    return NULL;

	tamA = strlen(a);

	temp = (char*) malloc(sizeof(char)*(tamA+2));

	for(i=0;i<tamA;i++)
	    temp[i] = a[i];
	temp[i++] = '*';
        temp[i] = '\0';
	
	return temp;
}

/*************************************************************
				Funcoes auxiliares 
**************************************************************/
//funcoes que encapsulam mensagens antes de fazer
// chamadas para funcoes especificas de livraria.c

char* descricaoISBN(t_estoque *estoque, char *msg)
{
    char *ISBN;
    ISBN = retornaSubstring(msg,2,11);
    return retornaDescricao(estoque, ISBN);
}

char* tudoISBN(t_estoque *estoque, char *msg)
{
    char *ISBN;
    ISBN = retornaSubstring(msg,2,11);
    return retornaInfoLivro(estoque, ISBN);
}

char* retornaNumISBN(t_estoque *estoque, char *msg)
{
    char *ISBN;
    ISBN = retornaSubstring(msg,2,11);
    return retornaNumLivro(estoque, ISBN);
}

//aqui, verifica-se se cliente e do tipo livraria, para
//verificar se tem permissao para realizar operacao pedida.
char* alteraNumISBN(t_estoque *estoque, char *msg)
{
    char *ISBN;
    int num;
    
    if (msg[1] == '0')
      return strdup("Operacao nao permitida.");
    ISBN = retornaSubstring(msg,2,11);
    num = atoi(retornaSubstring(msg,12,14));
    return alteraEstoque(estoque,ISBN,num);

}


/*************************************************************
  Funcao principal de tratamento de mensagem do cliente.	       
**************************************************************/

char* trataRequisicaoCliente(t_estoque *estoque,char *msg)
{
    char *respostaServidor, *aux;
    
    switch(msg[0])
    {
        case 'A': respostaServidor = retornaTitulosISBN(estoque);break;
        case 'B': respostaServidor = retornaInfoEstoque(estoque);break;
        case 'C': respostaServidor = descricaoISBN(estoque,msg);break;
        case 'D': respostaServidor = tudoISBN(estoque,msg);break;
        case 'E': respostaServidor = retornaNumISBN(estoque,msg);break;
        case 'F': respostaServidor = alteraNumISBN(estoque,msg);break;
        default:  respostaServidor = NULL;
    }
        
    if(respostaServidor != NULL)
        aux = respostaServidor;
        respostaServidor = encapsulaResposta(respostaServidor); 	
    return respostaServidor;
}
